package kgame5.kgui.kcomp.compajax {
/**
 * @author kangkai
 * 这个需要一个mc,用来承载整个
 */
import kgame5.kutil.*;

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class AJAXTable extends EventDispatcher{
	public static const EVENTTYPE_REFRESHED:String="EVENTTYPE_REFRESHED";
	//________________________Property__________________________
	
	private var mc_table:MovieClip;
	
	//设置一个列表，维持一个列表即可
	public var aCol:Array;
	
	public var aItem:Array;//为了查找最亲近的 而使用
	
	public var 
		HSpace:int=10,
		VSpace:int=10,
		ItemWidth:int=60;//每列的宽度
		//ItemHeight:int=60;//每列的高度
		
	//________________________Method________________________
	public function AJAXTable(p_mc_table:MovieClip,p_HSpace:int=10,p_VSpace:int=10,p_ItemWidth:int=60){
		mc_table=p_mc_table;//new MovieClip();//Util.AttachMC("MyMc_Table");
		
		if(mc_table.stage==null){
			mc_table.addEventListener(Event.ADDED_TO_STAGE, atsH);
		}else{
			atsH(null);
		}
		
		aCol=new Array();
		
		aItem=new Array();
		
		HSpace=p_HSpace;
		VSpace=p_VSpace;
		ItemWidth=p_ItemWidth;
	}
	private function atsH(e:Event){
		mc_table.stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
		mc_table.stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeave);
	}
	
	public function getMC():MovieClip{
		return mc_table;
	}
	public function size():int{
		return aItem.length;
	}
	//添加一列
	public function addCol(col:AJAXList){
		var initX:int=aCol.length*(ItemWidth+HSpace);//此col的x
		col.onAddedToTable(this,initX,aCol.length);
		aCol.push(col);
	}
	
	//删除一列
	//remoeCol(),不删除，固定就是n列
	
	//添加一个条目，条目需要跟踪空部分建立关联
	public function addItem(item:AJAXItem){
		item.onAddedToTable(this);
		mc_table.addChild(item.getFaceMC());
		mc_table.addChild(item.getRealBodyMC());
		aItem.push(item);
	}
	//最根本的就是在这里删除
	public function removeItem(item:AJAXItem){
		for(var i:int=0;i<aItem.length;i++){
			if(aItem[i]==item){
				mc_table.removeChild(item.getFaceMC());
				mc_table.removeChild(item.getRealBodyMC());
				aItem.splice(i,1);
				break;
			}
		}
	}
	
	//****************条目拖拽的事件
	protected var curDraggingItem:AJAXItem;
	protected var bDragging:Boolean=false;
	public function startDragItem(item:AJAXItem){
		bDragging=true;
		curDraggingItem=item;
		curDraggingItem.startDrag();
		mc_table.stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
		
		makeItemFloat(curDraggingItem);
	}
	
	//让某个item显示在最上层
	public function makeItemFloat(item:AJAXItem){
		//!!还有一个很重要的问题，每次谁要移动就吧谁放到最上层次上
		mc_table.setChildIndex(item.getRealBodyMC(),mc_table.numChildren-1);
		mc_table.setChildIndex(item.getFaceMC(),mc_table.numChildren-1);
	}
	
	public function stopDragItem(){
		if(bDragging){
			bDragging=false;
			curDraggingItem.stopDrag();
			
			//!!如果不是用stage注册的mouseMove,则如果其上有其他的mc,则不能够得到mouseMove事件
			mc_table.stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
		}
	}
	
	public function onStageMouseUp(e:MouseEvent){
		//T.p("table.onStageMouseUp");
		stopDragItem();
	}
	//鼠标离开舞台时调用,鼠标离开flash舞台
	private function onMouseLeave(e:Event){
		//T.p("mouseLeave");
		stopDragItem();
	}
	public function onMouseMove(e:MouseEvent){
		//T.p("onMouseMove");
		//检测碰撞到的并排序，找出相交面积最大的那个，注意处理没有碰撞的情况
		var aimItem:AJAXItem=findClosestItem(curDraggingItem);
		if(aimItem==null){//没有找到item,则去找col
			var aimList:AJAXList=findClosestList(curDraggingItem);//找到自己是在哪个列
			if(aimList!=null){
				placeItem_add(curDraggingItem,aimList);
			}
		}else if(aimItem!=curDraggingItem){//找到了别的
			placeItem_insert(curDraggingItem,aimItem);
		}
	}
	//****找到相交面积最大的AjaxItem
	private function findClosestItem(srcItem:AJAXItem):AJAXItem{
		//T.p("相交检测");
		
		var aTemp:Array=new Array();//保存相交的信息并对他们排序
		var srcRect:Rectangle=srcItem.getFaceMC().getRect(mc_table);
		
		for(var i:int=0;i<aItem.length;i++){
			
			var aimRect:Rectangle=aItem[i].getRealBodyMC().getRect(mc_table);
			
			var resultRect:Rectangle=srcRect.intersection(aimRect);
			
			var area:Number=resultRect.width*resultRect.height;
			if(area>0){//如果相交
				//T.p("检测到一个相交了："+aItem[i].getFaceMC().tf.text,resultRect);
				aTemp.push({item:aItem[i],area:area});//保存面积用来排序
			}
		}
		if(aTemp.length==0){//没有找到相交的
			//判断是在哪一列，追加到列的末尾即可
			return null;
		}else{
			
			aTemp.sortOn("area", Array.NUMERIC | Array.DESCENDING);
				
			//显示调试信息
			//MovieClip(mc_table.parent).tf_tracer.text=("最近的 是"+aTemp[0].item.getFaceMC().tf.text);
				
			return aTemp[0].item;
		}
	}
	
	//如果没有撞上所有条目则检测是哪一列撞上了
	private function findClosestList(srcItem:AJAXItem):AJAXList{
		//T.p("相交检测");
		
		var aTemp:Array=new Array();//保存相交的信息并对他们排序
		var srcRect:Rectangle=srcItem.getFaceMC().getRect(mc_table);
		
		//保存面积用来排序
		for(var i:int=0;i<aCol.length;i++){
			
			var aimRect:Rectangle=AJAXList(aCol[i]).rectArea;
			
			var resultRect:Rectangle=srcRect.intersection(aimRect);
			
			var area:Number=resultRect.width*resultRect.height;
			if(area>0){//如果相交
				//T.p("检测到一个相交了："+aItem[i].getFaceMC().tf.text,resultRect);
				aTemp.push({list:aCol[i],area:area});//保存面积用来排序
			}
		}
		if(aTemp.length==0){
			return null;
		}else{
			aTemp.sortOn("area", Array.NUMERIC | Array.DESCENDING);
					
			//显示调试信息
			//MovieClip(mc_table.parent).tf_tracer.text=("最近的 是"+aTemp[0].item.getFaceMC().tf.text);
					
			return aTemp[0].list;
		}
	}
	
	//把flaotItem在老的 地方删除，插入到新的列表里去
	private function placeItem_insert(floatItem:AJAXItem,aimItem:AJAXItem){
		var idx:int=aimItem.masterList.contains(aimItem);
		floatItem.masterList.removeItem(floatItem);//在同一行里交换两个条目
		aimItem.masterList.insertItemAt(idx, floatItem);
		
		//--所有界面都移动到指定位置~除了flaoting的面板
		moveAllFace();
	}
	//把flaotItem在老的 地方删除，添加新的列表里去
	private function placeItem_add(floatItem:AJAXItem,aimList:AJAXList){
		
		floatItem.masterList.removeItem(floatItem);//在同一行里交换两个条目
		aimList.addItem(floatItem);
		
		//--所有界面都移动到指定位置~除了flaoting的面板
		moveAllFace();
	}
	
	//所有界面都移动到指定位置
	public function moveAllFace(bAnim:Boolean=true){
		for(var i:int=0;i<aItem.length;i++){
			if(bAnim){//使用动画
				aItem[i].moveFace();
			}else{//不使用动画，直接放到制定位置
				aItem[i].placeFace();
			}
		}
	}
	
	//取得总高度
	public function getHeight():Number{
		var aTemp:Array=new Array();
		for(var i:int=0;i<aCol.length;i++){
			aTemp.push(AJAXList(aCol[i]).getHeight());
		}
		aTemp.sort(Array.NUMERIC);
		trace("高度：",aTemp[aTemp.length-1]);
		return aTemp[aTemp.length-1];
	}
	//通知外部说自己刷新了一下
	public function notifyRefreshed(){
		this.dispatchEvent(new KEvent(EVENTTYPE_REFRESHED));
	}
}//end of class
}
